home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************
- ;************************** D S P - P A U L A *************************
- ;**************** coded by Chris of AURA of the INEPENDENT ****************
- ;*************** first code : 14.04.93 ***************
- ;*************** last changes: 30.04.93 ***************
- ;****************************************************************************
-
- ;wichtige Hinweise:
- ;die DSP-Paula darf nur komplett im Y-Ram betrieben werden.
- ;Hostcommand $13 wird durch die DSP-Paula belegt-
- ;es werden insgesamt 2 Stackeinträge benötigt-
-
- dsp_paula_start: equ $4000-5050 ;Startadr. des DSP-Paulacodes
-
- v_hz: equ 50 ;VBL-Frequenz
- sam_bufcnt: equ 33300/v_hz ;max. Bytedurchsatzpufferlänge pro VBL
- ;Erfahrungswert
-
- ;*********************************************************************
- ;Vektor für Hostcommand 1 setzen
- org P:$26 ;Hostcommandvektor 1
- jsr dsp_paula
- ;*********************************************************************
- org P:dsp_paula_start
-
- install_paula:
- clr a
- move a1,P:voice1_par ;Stimme 1-Parameter setzen
- move a1,P:voice1_par+4 ;Restoffset
- move a1,P:voice1_par+5 ;auf 0,0
- move a1,P:voice2_par ;Stimme 2-Parameter setzen
- move a1,P:voice2_par+4 ;Restoffset
- move a1,P:voice2_par+5 ;auf 0,0
- move a1,P:voice3_par ;Stimme 3-Parameter setzen
- move a1,P:voice3_par+4 ;Restoffset
- move a1,P:voice3_par+5 ;auf 0,0
- move a1,P:voice4_par ;Stimme 4-Parameter setzen
- move a1,P:voice4_par+4 ;Restoffset
- move a1,P:voice4_par+5 ;auf 0,0
-
- move #sam_clc,r1
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,Y:(r1) ;Samplebyteanzahl holen
-
- move #mono1_trk,r0 ;Monospuren
- rep #990*2
- move a,Y:(r0)+ ;löschen
-
- infinity:
- jmp infinity
-
- ;*********************************************************************
- dsp_paula:
- ;vorberechnete Stereodaten an den Host
- ori #$3,mr ;alle IRQs sperren
-
- move r0,P:save_reg
- move #save_reg+1,r0
- move m0,P:save_reg+19
- movec #$ffff,m0
- nop
- move r1,Y:(r0)+ ;Adressregister
- move r2,Y:(r0)+
- move r3,Y:(r0)+
- move n0,Y:(r0)+
- move n2,Y:(r0)+
- move m1,Y:(r0)+ ;Modifierreg.
- move m2,Y:(r0)+
- move m3,Y:(r0)+
- move x0,Y:(r0)+ ;Arithmetikregister
- move x1,Y:(r0)+
- move y0,Y:(r0)+
- move y1,Y:(r0)+
- move a2,Y:(r0)+
- move a1,Y:(r0)+
- move a0,Y:(r0)+
- move b2,Y:(r0)+
- move b1,Y:(r0)+
- move b0,Y:(r0)+
-
- movec m0,m1
- movec m0,m2 ;setzen
- movec m0,m3
-
- bset #3,X:<<$ffe8 ;HF2 setzen >> DSP-Paula am Werk
-
- move #mono1_trk,r0 ;1. Monospur
- move #mono2_trk,r1 ;2. Monospur
- jsr send_sample_data ;Stereo an den Host
-
- ;Samples der 4 Stimmen holen
- move #voice1_par,r0
- jsr get_sample_data ;Sampledaten holen
-
- move #voice2_par,r0 ;2. Stimme
- jsr get_sample_data ;Sampledaten holen
-
- move #voice3_par,r0 ;3. Stimme
- jsr get_sample_data ;Sampledaten holen
-
- move #voice4_par,r0 ;4. Stimme
- jsr get_sample_data ;Sampledaten holen
-
- ;Stimmen mischen
- move #voice1_par,r0 ;Puffer der 1. Stimme
- move #mono1_trk,r1 ;1. Monopuffer
- jsr calc_one_voice ;berechnen
-
- move #voice4_par,r0 ;Puffer der 4. Stimme
- move #mono1_trk,r1 ;1. Monopuffer
- jsr mix_one_voice ;berechnen und dazumischen
-
- move #voice2_par,r0 ;Puffer der 2. Stimme
- move #mono2_trk,r1 ;2. Monopuffer
- jsr calc_one_voice ;berechnen
-
- move #voice3_par,r0 ;Puffer der 3. Stimme
- move #mono2_trk,r1 ;3. Monopuffer
- jsr mix_one_voice ;berechnen und dazumischen
-
- move #save_reg+1,r0
- nop
- move Y:(r0)+,r1 ;Adressregister
- move Y:(r0)+,r2
- move Y:(r0)+,r3
- move Y:(r0)+,n0
- move Y:(r0)+,n2
- move Y:(r0)+,m1 ;Modifierreg.
- move Y:(r0)+,m2
- move Y:(r0)+,m3
- move Y:(r0)+,x0 ;Arithmetikregister
- move Y:(r0)+,x1
- move Y:(r0)+,y0
- move Y:(r0)+,y1
- move Y:(r0)+,a2
- move Y:(r0)+,a1
- move Y:(r0)+,a0
- move Y:(r0)+,b2
- move Y:(r0)+,b1
- move Y:(r0)+,b0
- move Y:(r0)+,m0 ;Modifierreg.
- move P:save_reg,r0
-
- bclr #3,X:<<$ffe8 ;HF2 löschen >> DSP nun frei
- rti
- ;***************************************
- ;Berechnet 1 Spur ohne mischen
- ;r0: Parameteradr. des Samples
- ;r1: Monopuffer für den PCM-Chip
- calc_one_voice:
- lua (r0)+,r2 ;1 Eintrag überspringen
- nop ;Pipeline-NOP
- move Y:(r2)+,y1 ;Lautstärke holen
- move Y:(r2)+,x1 ;Sample-Vorkommaoffset holen
- move Y:(r2)+,x0 ;Sample-Nachkommaoffset holen
- move r2,r3
- move Y:(r2)+,b ;Restvorkomma holen
- move Y:(r2)+,b0 ;Restnachkomma holen
- move r2,y0 ;Sampleadr.
- add y0,b r2,n2 ;+,Sampleadr. retten
- move b1,r2 ;Startadr. im Samplepuffer
- move P:sam_clc,y0 ;Anzahl holen
-
- do y0,calc_one_voice_do
- add x,b Y:(r2),y0 ;Sampleoffset addieren
- ;Samplebyte holen
- mpy y1,y0,a b1,r2 ;*Lautstärke,neue Sampleadr. holen
- move a,Y:(r1)+ ;und speichern
- calc_one_voice_do:
-
- move n2,x0 ;Samplestart holen
- sub x0,b ;- akt. Sampleposition
- move b1,x0
- bclr #0,x0 ;auf Wort abrunden
- move x0,Y:(r0) ;und speichern
- sub x0,b ;- >> Restoffset errechnen
- move b1,Y:(r3)+ ;und für nächsten VBL speichern
- move b0,Y:(r3)
- rts
- ;***************************************
- ;Berechnet 1 Spur mit mischen
- ;r0: Pufferadr. des Samples
- ;r1: Monopuffer für den PCM-Chip
- mix_one_voice:
- lua (r0)+,r2 ;1 Eintrag überspringen
- nop ;Pipeline-NOP
- move Y:(r2)+,y1 ;Lautstärke holen
- move Y:(r2)+,x1 ;Sample-Vorkommaoffset holen
- move Y:(r2)+,x0 ;Sample-Nachkommaoffset holen
- move r2,r3
- move Y:(r2)+,b ;Restvorkomma holen
- move Y:(r2)+,b0 ;Restnachkomma holen
- move r2,y0 ;Sampleadr.
- add y0,b r2,n2 ;+,Sampleadr. retten
- move b1,r2 ;Startadr. im Samplepuffer
- move P:sam_clc,y0 ;Anzahl
-
- do y0,mix_one_voice_do
- add x,b Y:(r2),y0 ;Sampleoffset addieren
- ;Samplebyte holen
- move Y:(r1),a ;zuvor berechn. Samplewert holen
- mac y1,y0,a b1,r2 ;*Lautstärke,neue Sampleadr. holen
- move a,Y:(r1)+ ;und speichern
- mix_one_voice_do:
-
- move n2,x0 ;Samplestart holen
- sub x0,b ;- akt. Sampleposition
- move b1,x0
- bclr #0,x0 ;auf Wort abrunden
- move x0,Y:(r0) ;und speichern
- sub x0,b ;- >> Restoffset errechnen
- move b1,Y:(r3)+ ;und für nächsten VBL speichern
- move b0,Y:(r3)
- rts
- ;***************************************
- ;Läd Lautstärke und Sample in den Y-Speicher
- ;Sampledaten von 0 bis 255
- ;r0: Parameteradr. des Sampels
- get_sample_data:
- jclr #1,X:<<$ffe9,*
- movep Y:(r0)+,X:<<$ffeb ;Tatsächlich bearb. Bytes senden
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,Y:(r0)+ ;Lautstärke holen
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,Y:(r0)+ ;Schrittweite Vorkomma holen
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,Y:(r0)+ ;Schrittweite Nachkomma holen
-
- move #<2,n0
- nop ;Pipeline-NOP
- lua (r0)+n0,r0 ;Restwert überspringen
-
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,y0 ;Anzahl der zu übertr. Worte holen
-
- move #>$10000/2,x0 ;Verschiebungswert durch mpy
- move #>128,x1 ;Subr.Wert
- move #>$0000FF,y1 ;Ausmaskierungswert
- do y0,load_sample
- jclr #0,X:<<$ffe9,*
- movep X:<<$ffeb,y0 ;2 8-bit-Samplewerte holen
- ;wichtig: oberstes Byte mu₧ null sein
- mpy x0,y0,a ;oberes Byte nach a1 schieben
- sub x1,a ;-128
- move y0,a a,Y:(r0)+ ;und speichern
- and y1,a ;unteres Byte holen
- sub x1,a ;-128
- move a,Y:(r0)+ ;unteres Byte speichern
- load_sample:
- rts
- ;***************************************
- ;Sendet fertiges Stereosample aus dem Y-Speicher
- ;r0: Pufferadr. der 1. Spur
- ;r1: Pufferadr. der 2. Spur
- send_sample_data:
- move #>$100/2,x0 ;Verschiebungswert durch mpy
- move #>$0000ff,x1 ;Ausmaskierungswert
-
- move P:sam_clc,y0 ;Anzahl holen
- do y0,send_sample
- move Y:(r1)+,a ;2. Monowert holen
- and x1,a Y:(r0)+,y0 ;1. Monowert holen
- move a1,a0
- mac x0,y0,a ;um 8 Bit links und dazuodern
- ;oberstes Byte unwichtig da nur
- ;wortweise vom DSP gelesen wird
- jclr #1,X:<<$ffe9,*
- movep a0,X:<<$ffeb ;Stereosamplewert senden
- send_sample:
- rts
- ;***************************************
- save_reg: ds 20
- sam_clc: ds 1 ;Anzahl der Samplebytes
- ;Parameter und Puffer für die Samples
- voice1_par: ds 1 ;tatsächlich abgearb. Bytes
- ;auf Wortgrenze abgerundet
- ;mu₧ dem Host vor neuer Sampleübergabe
- ;übermittelt werden
- ;Lautstärke als Fraktionalwert (zw. 0 und 1)
- ds 1 ;Lautstärke als Kommawert
- ;vom Host pro VBL übermittelt
- ;Schrittweite innerhalb des Samples
- ds 2 ;Sampleoffset (48 Bit)
- ;Da der Samplepuffer nie vollständig abgearbeitet wird, bleibt ein Rest
- ;übrig der das nächste Mal zur voice_buf-Adr. dazuaddiert werden mu₧.
- ds 2 ;Restoffset von der letzten Berechnung
- voice1_buf: ds sam_bufcnt ;Puffer der Sampledaten
-
- voice2_par: ds 6
- voice2_buf: ds sam_bufcnt ;Puffer der Sampledaten
- voice3_par: ds 6
- voice3_buf: ds sam_bufcnt ;Puffer der Sampledaten
- voice4_par: ds 6
- voice4_buf: ds sam_bufcnt ;Puffer der Sampledaten
-
-
- ;****************************************
- ;Stereopuffer, jedoch noch in 2 Spuren getrennt
- mono1_trk: ds 990 ;Monospur 1
- mono2_trk: ds 990 ;Monospur 2
- ;****************************************
- end:
- end dsp_paula_start ;Installierung starten